﻿using BusinessInterface;
using Microsoft.AspNetCore.Authorization;
using System.Security.Claims;

namespace ApiServer.Utilitys.AuthorizationExt
{

    /// <summary>
    /// 鉴权处理类,该脚本由于继承了系统内置的AuthorizationHandler
    /// 当控制器或者net core的特性中使用了AuthorizeAttribute时，会自动调用此类进行鉴权
    /// </summary>
    public class MenuAuthorizeHandler : AuthorizationHandler<MenuAuthorizeRequirement>
    {
        private readonly IUserManagerService _IUserManagerService;

        /// <summary>
        /// 构造函数注入
        /// </summary>
        /// <param name="iUserManagerService"></param>

        public MenuAuthorizeHandler(IUserManagerService iUserManagerService)
        {
            _IUserManagerService = iUserManagerService;
        }



        /// <summary>
        /// 调用时机：按钮点击事件
        /// 功能：校验用户是否有按钮权限
        /// </summary>
        /// <param name="context"></param>
        /// <param name="requirement"></param>
        /// <returns></returns>
        protected override async Task HandleRequirementAsync(AuthorizationHandlerContext context, MenuAuthorizeRequirement requirement)
        {
            //if (context.User.Claims == null || context.User.Claims.Count() <= 0)
            //{
            //    context?.Fail();
            //}

            ////以下代码测试发现数据库中，Menu-GetMenuList 并没有，导致跨域报错
            //else if (context.User.IsInRole("admin") || context.User.Claims.Any(c => c.Type.Equals(ClaimTypes.Name) && c.Value.Equals("admin")))
            //{
            //    context?.Succeed(requirement);//只要执行这句话就表示验证通过了
            //}
            //else
            //{
            //    HttpContext httpcontext = (HttpContext)context.Resource!;

            //    //通过token中包含的按钮权限来校验 不建议使用。
            //    //本项目token中只包含菜单权限，但是如果存在多个用户，操控同一份数据时，有可能出现权限不一致的问题。
            //    {

            //        //List<string> currentUserBtnList = httpcontext.User.Claims
            //        //    .Where(c => c.Type.Equals("Btns"))
            //        //    .Select(c => c.Value)
            //        //    .ToList();
            //        //object? controllerName = httpcontext.GetRouteValue("controller");
            //        //object? actionName = httpcontext.GetRouteValue("action");

            //        //bool iContains = currentUserBtnList
            //        //    .Any(m => m.Equals($"{controllerName}-{actionName}", StringComparison.OrdinalIgnoreCase));
            //        //if (iContains)
            //        //{
            //        //    context?.Succeed(requirement);//只要执行这句话就表示验证通过了
            //        //}
            //        //else
            //        //{
            //        //    context?.Fail();
            //        //}
            //    }

            //    //解析到用户信息后, 通过用户的id 去查询下用户具备哪些权限
            //    //链接数据库了
            //    {

            //        string? strUserId = httpcontext.User?.Claims?
            //             .FirstOrDefault(c => c.Type.Equals(ClaimTypes.Sid))?
            //             .Value;

            //        if (strUserId == null)
            //        {
            //            context?.Fail();

            //        }
            //        else
            //        {

            //            object? controllerName = httpcontext.GetRouteValue("controller");
            //            object? actionName = httpcontext.GetRouteValue("action");
            //            //数据库中按钮有个属性为BtnValue   格式为 控制器名-方法名: role-deleteRole
                          //实测发现数据库中，Menu-GetMenuList 并没有，导致跨域报错
            //            bool bReuslt = await _IUserManagerService.ValidateBtnAsync(Convert.ToInt32(strUserId), $"{controllerName}-{actionName}");

            //            if (bReuslt)
            //            {
            //                context?.Succeed(requirement);//只要执行这句话就表示验证通过了

            //            }
            //            else
            //            {
            //                context?.Fail();
            //            }
            //        }





            //    }

            //}
            await Task.CompletedTask;
        }
    }
}
